<?php

class FlagLookup{

    public static function lookup($identifier)
    {
        if(static::ccExists($identifier)){
            return $identifier;
        }

        if(static::languageCodeExists($identifier)){
            return static::$languageCodeMap[$identifier];
        }

        if(static::getFromLocaleCode($identifier) !== null){
            return static::getFromLocaleCode($identifier);
        }

        return "generic";
    }

    private static function ccExists($ccProspect){
        return in_array($ccProspect, static::$flags);
    }

    private static function languageCodeExists($lcProspect){
        return in_array($lcProspect, array_keys(static::$languageCodeMap));
    }

    private static function getFromLocaleCode($lcProspect){
        $re = "/(\\w{2})(_|-)(\\w{2})/";
        $matches = [];

        preg_match($re, $lcProspect, $matches);
        return isset($matches[3])?strtolower($matches[3]):null;
    }

    private static $languageCodeMap = [
        'en'=>'us'
    ];

    private static $flags = [
        "ad",
        "ae",
        "af",
        "ag",
        "al",
        "am",
        "ao",
        "ar",
        "at",
        "au",
        "az",
        "ba",
        "bb",
        "bd",
        "be",
        "bf",
        "bg",
        "bh",
        "bi",
        "bj",
        "bn",
        "bo",
        "br",
        "bs",
        "bt",
        "bw",
        "by",
        "bz",
        "ca",
        "cd",
        "cf",
        "cg",
        "ch",
        "ci",
        "cl",
        "cm",
        "cn",
        "co",
        "cr",
        "cu",
        "cv",
        "cy",
        "cz",
        "de",
        "dj",
        "dk",
        "dm",
        "do",
        "dz",
        "ec",
        "ee",
        "eg",
        "eh",
        "er",
        "es",
        "et",
        "fi",
        "fj",
        "fm",
        "fr",
        "ga",
        "gb",
        "gd",
        "ge",
        "gh",
        "gm",
        "gn",
        "gq",
        "gr",
        "gt",
        "gw",
        "gy",
        "hn",
        "hr",
        "ht",
        "hu",
        "id",
        "ie",
        "il",
        "in",
        "iq",
        "ir",
        "is",
        "it",
        "jm",
        "jo",
        "jp",
        "ke",
        "kg",
        "kh",
        "ki",
        "km",
        "kn",
        "kp",
        "kr",
        "ks",
        "kw",
        "kz",
        "la",
        "lb",
        "lc",
        "li",
        "lk",
        "lr",
        "ls",
        "lt",
        "lu",
        "lv",
        "ly",
        "ma",
        "mc",
        "md",
        "me",
        "mg",
        "mh",
        "mk",
        "ml",
        "mm",
        "mn",
        "mr",
        "mt",
        "mu",
        "mv",
        "mw",
        "mx",
        "my",
        "mz",
        "na",
        "ne",
        "ng",
        "ni",
        "nl",
        "no",
        "np",
        "nr",
        "nz",
        "om",
        "pa",
        "pe",
        "pg",
        "ph",
        "pk",
        "pl",
        "pt",
        "pw",
        "py",
        "qa",
        "ro",
        "rs",
        "ru",
        "rw",
        "sa",
        "sb",
        "sc",
        "sd",
        "se",
        "sg",
        "si",
        "sk",
        "sl",
        "sm",
        "sn",
        "so",
        "sr",
        "st",
        "sv",
        "sy",
        "sz",
        "td",
        "tg",
        "th",
        "tj",
        "tl",
        "tm",
        "tn",
        "to",
        "tr",
        "tt",
        "tv",
        "tw",
        "tz",
        "ua",
        "ug",
        "us",
        "uy",
        "uz",
        "va",
        "vc",
        "ve",
        "vn",
        "vu",
        "ws",
        "ye",
        "za",
        "zm",
        "zw"
    ];
}